﻿using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;

public class DragListener : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler
{
	public delegate void VoidDelegate(GameObject go, BaseEventData eventData);

    public VoidDelegate onBeginDrag;
    public VoidDelegate onEndDrag;
    public VoidDelegate onDrag;

	public static DragListener Get(MonoBehaviour component)
	{
		return Get(component.gameObject);
	}

	public static DragListener Get(GameObject go)
	{
		DragListener listener = go.GetComponent<DragListener>();
		if (listener == null) listener = go.AddComponent<DragListener>();
		return listener;
	}

	public void OnBeginDrag(PointerEventData eventData)
    {
		if (onBeginDrag != null) onBeginDrag(gameObject, eventData);
	}

	public void OnEndDrag(PointerEventData eventData)
    {
		if (onEndDrag != null) onEndDrag(gameObject, eventData);
    }

	public void OnDrag(PointerEventData eventData)
    {
		if (onDrag != null) onDrag(gameObject, eventData);
    }
    // --------------------------------------------------------------------------------------------
    // 扩展接口
	public static void AddBeginDrag(GameObject go, VoidDelegate onBeginDrag)
    {
		Get(go).onBeginDrag += onBeginDrag;
    }

	public static void AddBeginDrag(Component component, VoidDelegate onBeginDrag)
    {
		AddBeginDrag(component.gameObject, onBeginDrag);
    }

	public static void AddEndDrag(GameObject go, VoidDelegate onEndDrag)
    {
		Get(go).onEndDrag += onEndDrag;
    }

	public static void AddEndDrag(Component component, VoidDelegate onEndDrag)
    {
		AddEndDrag(component.gameObject, onEndDrag);
    }

	public static void AddDrag(GameObject go, VoidDelegate onDrag)
    {
		Get(go).onDrag += onDrag;
    }

	public static void AddDrag(Component component, VoidDelegate onDrag)
    {
		AddDrag(component.gameObject, onDrag);
    }

	public static void RemoveBeginDrag(GameObject go, VoidDelegate onBeginDrag)
    {
		Get(go).onBeginDrag -= onBeginDrag;
    }

	public static void RemoveBeginDrag(Component component, VoidDelegate onBeginDrag)
    {
		RemoveBeginDrag(component.gameObject, onBeginDrag);
    }

	public static void RemoveEndDrag(GameObject go, VoidDelegate onEndDrag)
    {
		Get(go).onEndDrag -= onEndDrag;
    }

	public static void RemoveEndDrag(Component component, VoidDelegate onEndDrag)
    {
		RemoveEndDrag(component.gameObject, onEndDrag);
    }

	public static void RemoveDrag(GameObject go, VoidDelegate onDrag)
    {
		Get(go).onDrag -= onDrag;
    }

	public static void RemoveDrag(Component component, VoidDelegate onDrag)
    {
		RemoveDrag(component.gameObject, onDrag);
    }
}